# _*_coding:utf-8 _*_
#@Time    :2019/3/28 17:12
#@Author  :Dapan
#@Email : 248312738@qq.com
# 功能模块文件
import psutil
import sys
import re
import ctypes
from rely.dataDase_action import GetMCode
import logging
import traceback
import time
import os


class Logger():  # 日志类
    def __init__(self):
        if not os.path.exists("./log"):
            os.mkdir("./log")
        # 创建一个logger
        self.logger = logging.getLogger(" ")
        self.logger.setLevel(logging.DEBUG)

        # 创建一个handler，用于写入日志文件
        now_time = time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime(time.time()))  # 当前时间点 格式化后
        fh = logging.FileHandler('./log/log_{}.log'.format(now_time))
        fh.setLevel(logging.DEBUG)  # 日志级别

        # 再创建一个handler，用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.INFO)  # 日志级别

        # 定义输出到文件的格式
        formatter1 = logging.Formatter('[%(asctime)s][%(filename)s][line: %(lineno)d][%(levelname)s] => %(message)s')
        # 定义输出到控制台的格式
        formatter2 = logging.Formatter('%(message)s')

        fh.setFormatter(formatter1)
        ch.setFormatter(formatter2)

        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

    def get_log(self):
    # 记录一条日志
        return self.logger

logger = Logger().get_log()


def TraceBack(func):
    """
    接收异常堆栈信息的装饰器
    :param func: 被装饰的函数名
    :return:
    """
    def inner(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except:
            s = traceback.format_exc()
            logger.error(s)

    return inner


def VersionControl(fuc):
    """
    版本控制装饰器
    :param fuc:被装饰函数名
    :return:
    """
    def inner(*args, **kwargs):
        DB = GetMCode()
        vesion_str = DB.query_version()
        logger.info('当前最新版本：%s' % vesion_str)
        if vesion_str == "v2.0":
            logger.info('本机版本:v2.0')
            fuc(*args, **kwargs)
        else:
            logger.info('版本不符')
            ctypes.windll.user32.MessageBoxA(0, "软件已经更新到 {}版本，\n请联系管理员获取最新版本".format(vesion_str).encode('GBK'),
                                     '提示 ^_^'.encode('GBK'), 0)
    return inner



def ProgramUnique(func):
    """
    装饰器：检测该程序实例是否已经运行
    :param func: 被装饰的函数
    :return:
    """
    def inner(*args, **kwargs):
        symbol = re.match(r"^[A-Z]:(.).+", sys.argv[0]).group(1)  # 绝对路径 ：sys.argv[0]
        if symbol == "/":
            file_name = sys.argv[0].split("/")[-1]
        elif symbol == "\\":
            file_name = sys.argv[0].split("\\")[-1]
        else:
            ctypes.windll.user32.MessageBoxA(0, u"获取系统异常".encode("gbk"), u'异常'.encode("gbk"), 0)
            sys.exit()
        if file_name == "标准计划删除工具.exe":
            pids = psutil.pids()
            py_list = []
            i = 1
            for pid in pids:
                p = psutil.Process(pid)
                p_name = p.name()
                if p_name == "标准计划删除工具.exe":
                    py_list.append(p_name)
                i += 1
            if len(py_list) > 1:
                logger.info('程序已经启动')
                ctypes.windll.user32.MessageBoxA(0, u"程序已经启动...".encode("gbk"),u'异常'.encode("gbk"), 0)
                sys.exit()
            else:
                func(*args, **kwargs)
        else:
            ctypes.windll.user32.MessageBoxA(0, u"请勿修改程序名".encode("gbk"), u'异常'.encode("gbk"), 0)
            sys.exit()

    return inner






def tips_ww(db):
    """
    根据检测旺旺名后的结果，展示对应
    :return:
    """
    _info = db.query_tips()
    ctypes.windll.user32.MessageBoxA(0, "该旺旺名暂时还没注册\n{}".format(_info).encode('GBK'),
                                     '提示 ^_^'.encode('GBK'), 0)



if __name__ == '__main__':

    @VersionControl
    def a(DB):
        print("开始")
    a()


    @ProgramUnique
    def b():
        print(61)

    a = GetMCode()
    tips_ww(a)

    print(a.query_version())
